package hyperNexusType

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"
)

// Scan 从数据库读取数据后，将其转换为Uint64Array类型
func (a *Uint64Array) Scan(value interface{}) error {
	var bytes []byte
	switch v := value.(type) {
	case []byte:
		bytes = v
	case string:
		bytes = []byte(v)
	case nil:
		*a = nil
		return nil
	default:
		return fmt.Errorf("不支持的数据库类型: %T", value)
	}
	return json.Unmarshal(bytes, a)
}

// Value 将Uint64Array转换为数据库可存储的JSON格式
func (a Uint64Array) Value() (driver.Value, error) {
	if a == nil {
		return nil, nil
	}
	return json.Marshal(a)
}

// Scan 从数据库读取数据并反序列化为Uint32Array
func (a *Uint32Array) Scan(value interface{}) error {
	var bytes []byte
	switch v := value.(type) {
	case []byte:
		bytes = v
	case string:
		bytes = []byte(v)
	case nil:
		*a = nil
		return nil
	default:
		return fmt.Errorf("unsupported database type: %T", value)
	}
	return json.Unmarshal(bytes, a)
}

// Value 将Uint32Array序列化为JSON存入数据库
func (a Uint32Array) Value() (driver.Value, error) {
	if a == nil {
		return nil, nil
	}
	return json.Marshal(a)
}

// 实现 Scanner/Valuer 接口
func (s *StringArray) Scan(value interface{}) error {
	bytes, ok := value.([]byte)
	if !ok {
		return errors.New("invalid data type")
	}
	return json.Unmarshal(bytes, s)
}

func (s StringArray) Value() (driver.Value, error) {
	return json.Marshal(s)
}
